
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>CAP原则与Base理论 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>CAP原则与Base理论 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">CAP定理的核心内容是什么？它对分布式系统设计有何启示？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">CAP定理指的是在一个分布式系统中，一致性（Consistency）、可用性（Availability）、分区容错性（Partition tolerance）这三个要素最多只能同时实现两点，不可能三者都实现。这启示我们在设计系统时必须在一致性和可用性之间做出权衡。</div>
          </div>
          <div class="card-source">来源: CAP原则</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">为什么在保证分区容错性（P）的前提下，一致性（C）和可用性（A）会产生矛盾？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为当网络分区发生时，如果为了保证一致性，节点间数据同步完成前必须锁定服务，阻止读取旧数据，这就会牺牲可用性。反之，如果为了保证可用性，让节点在任何时候都响应请求，那么在数据同步完成前，用户可能会读到不一致的旧数据，从而牺牲了一致性。</div>
          </div>
          <div class="card-source">来源: Consistency 和 Availability 的矛盾</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">作为对CAP理论的补充，BASE理论的核心思想是什么？请解释其三个构成要素。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">BASE理论的核心是放弃强一致性，追求最终一致性。其三要素是：BA（基本可用 - Basically Available），允许系统在故障时损失部分可用性；S（软状态 - Soft State），允许数据存在同步延迟的中间状态；E（最终一致性 - Eventual Consistency），保证数据副本在一段时间后最终能达到一致状态。</div>
          </div>
          <div class="card-source">来源: Base理论</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Zookeeper在CAP模型中是如何取舍的？这种选择在特定场景下会带来什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Zookeeper选择了CP，即保证一致性和分区容错性。当master节点因网络故障与其它节点失联时，剩余节点会重新选举leader。问题在于选举时间较长（30-120秒），选举期间整个ZK集群都是不可用的，导致服务注册等功能瘫痪，牺牲了可用性（A）。</div>
          </div>
          <div class="card-source">来源: Zookeeper保证CP</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">与Zookeeper不同，Eureka在CAP模型中做了何种选择？它通过什么机制来保证其选择的特性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Eureka选择了AP，即保证可用性和分区容错性。它通过一种自我保护机制来实现高可用：当在15分钟内超过85%的节点没有正常心跳时，Eureka会认为出现了网络故障，此时它不再移除过期的服务实例，以防止因网络问题而误杀服务，从而保证了注册服务的可用性。</div>
          </div>
          <div class="card-source">来源: Eureka保证AP</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Nacos如何灵活地支持CP和AP两种架构模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nacos通过实例的“临时”或“持久”类型来选择架构。当实例配置为临时实例（ephemeral: true）时，Nacos采用CP架构，客户端心跳丢失后会及时删除实例以保证数据一致性。当配置为持久化实例（ephemeral: false）时，采用AP架构，心跳丢失后仅标记为不健康而不删除，保证了服务的可用性。</div>
          </div>
          <div class="card-source">来源: ncaos</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">CP架构的系统（如Zookeeper）是如何利用选举机制来防止“脑裂”问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">CP架构通过“投票数过半”的原则来防止脑裂。当进行leader选举时，一个节点必须获得超过集群总节点数一半的投票才能成为leader。这个机制确保了即使发生网络分区，最多也只有一个分区能够满足条件选举出leader，从而避免了集群中出现多个master节点。</div>
          </div>
          <div class="card-source">来源: nacos和zookeeper是如何防止脑裂的</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为什么在需要选举机制的分布式集群中，推荐将节点数量设置为奇数？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要有两个原因：首先，奇数个节点可以更好地防止因网络分区导致无法选出leader的情况（例如偶数节点对半分裂）。其次，在相同的容错能力下，奇数节点比偶数节点更节省资源。例如，5个节点和6个节点的集群都只能容忍2个节点故障，但5个节点的集群资源成本更低。</div>
          </div>
          <div class="card-source">来源: 集群节点个数为什么推荐是奇数个</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">请解释“强一致性”和“最终一致性”之间的区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">强一致性要求在写操作完成后，任何后续的读操作都必须立即返回最新的值，不允许存在延迟。而最终一致性则允许系统在不同节点的数据副本之间存在短暂的同步延迟和数据不一致，但保证在经过一段时间后，所有数据副本最终能够达到一致的状态。</div>
          </div>
          <div class="card-source">来源: 一致性的问题</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
